/*
 * Main.java
 *
 * Created on 29 Сентябрь 2007 г., 14:32
 *
 */

package xmppbot;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import org.jivesoftware.smack.XMPPException;
import xmppbot.funcs.session;

/**
 *
 * @author lian
 */
public class Main {
    public static JJConnect Connect;
    public static HashMap<String, JJConnect> Connects;
    public static ArrayList<String> Connectsnames;
    @SuppressWarnings("unchecked")
    public static HashMap<String, ArrayList<session>> sessions = new HashMap();
    @SuppressWarnings("unchecked")
    public static ArrayList<String> sessionnames = new ArrayList();
    public static String[] argss;
    public static Random rand = new Random();
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws InterruptedException, XMPPException, ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        argss = args;
        Connects = new HashMap();
        Connectsnames = new ArrayList();
        // Коннектимся к базе
        db mysqldb = new db(args[0], args[1], args[2], args[3], args[4]);
        // Получаем список серверов
        ResultSet rs = mysqldb.getStatement().executeQuery("SELECT * FROM servers;");
        ResultSet rs2 = null;
        // Парсим список серверов и соединяемся с каждым
        // зтатем добавляем объекты JJConnect в HashMap Connects и в ArrayList Connectsnames 
        while (rs.next()) {
            int id = rs.getInt("id");
            // servkey полный JID аккаунта на сервере
            String servkey = rs.getString("user") + "@" + rs.getString("server") + "/" + rs.getString("resource");
            Connects.put(servkey, new JJConnect(rs.getString("server"), rs.getString("user"), rs.getString("pass"), rs.getString("resource")));
            Connectsnames.add(servkey);
            Connects.get(servkey).Connect();
            Connects.get(servkey).mysqldb = mysqldb;
            // получаем из базы настройки
            Connects.get(servkey).UpdateSettings();
            Connect = Connects.get(servkey);
            // получаем и базы список конференций, к которым нужно подключится данным юзером
            rs2 = mysqldb.getStatement().executeQuery("SELECT * FROM conferences WHERE server = " + id + ";");
            // джонимся на на конференциях
            while (rs2.next()) {
                if (rs2.getInt("enable") == 1) {
                    Connects.get(servkey).join(rs2.getString("login"), rs2.getString("conference"));
                }
                Thread.sleep(5000);
            }
            db.killrs(rs2); rs2 = null;
        }
        db.killrs(rs); rs = null;
        
        while (true) {
            //clearStatements();
            Thread.sleep(60000);
        }
    }
    /**
     * Останавливает или перезапускает работу бота
     * @param stop если true, то производится завершение работы бота, если false перезапуск
     */
    public static void restart(boolean stop) throws SQLException, InterruptedException, XMPPException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        int i;
        //clearStatements();
        for (i = 0; i < Connectsnames.size(); i++) {
            Connects.get(Connectsnames.get(i)).Disconnect();
            JJConnect conn = Connects.get(Connectsnames.get(i));
            conn = null;
            Connects.remove(Connectsnames.get(i));
        }
        //((JJConnect) Connects.get(Connectsnames.get(i))).mysqldb.mysqlconn.close();
        if (!stop) {
            main(argss);
        }
    }
    
//    public static void clearStatements () throws SQLException {
//        db mysqldb = Connect.mysqldb; 
//        for (int i = 0; i < mysqldb.statements.size(); i++) {
//                ((Statement) mysqldb.statements.get(i)).close();
//                mysqldb.statements.remove(i);
//        }
//    }
    
//    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
//        db mysqldb = new db(args[0], args[1], args[2], args[3], args[4]);
//
//        String FuncName     = "cmd";
//        ArrayList FuncVals  = new ArrayList();
//        FuncVals.add("!cmd");
//        FuncVals.add("!c");
//
//        String SuperAdmin   = "1";  /* chat      */ int idc  = 1; /* -> */ int idco  = 1; int execc  = 1; int ansc  = 1;
//        String User         = "0";  /* groupchat */ int idg  = 2; /* -> */ int idgo  = 2; int execg  = 0; int ansg  = 0;
//        String Anonym       = "0";  /* private   */ int idp  = 3; /* -> */ int idpo  = 3; int execp  = 1; int ansp  = 1;
//                                    /* gprivate  */ int idgp = 4; /* -> */ int idgpo = 4; int execgp = 0; int ansgp = 0;
//
//        mysqldb.getStatement().executeUpdate("INSERT INTO `xmppbot`.`funcs` (`id`,`func`) VALUES (NULL,'_" + FuncName + "');");
//        String str = "INSERT INTO `xmppbot`.`funcsvals` (`id`,`func`,`val`) VALUES (NULL,(SELECT id FROM funcs WHERE func = '_" + FuncName + "'),'')";
//        for (int i = 0; i < FuncVals.size(); i++) {
//            mysqldb.getStatement().executeUpdate("INSERT INTO `xmppbot`.`funcsvals` (`id`,`func`,`val`) VALUES (NULL,(SELECT id FROM funcs WHERE func = '_" + FuncName + "'),'" + FuncVals.get(i) + "')");
//        }
//        mysqldb.getStatement().executeUpdate("ALTER TABLE `UserRoles` ADD `" + FuncName + "` SMALLINT NOT NULL;");
//        mysqldb.getStatement().executeUpdate("UPDATE `xmppbot`.`UserRoles` SET `" + FuncName + "`='" + SuperAdmin + "' WHERE CONVERT( `UserRoles`.`role` USING utf8 ) = 'superadmin' LIMIT 1;");
//        mysqldb.getStatement().executeUpdate("UPDATE `xmppbot`.`UserRoles` SET `" + FuncName + "`='" + User + "' WHERE CONVERT( `UserRoles`.`role` USING utf8 ) = 'user' LIMIT 1;");
//        mysqldb.getStatement().executeUpdate("UPDATE `xmppbot`.`UserRoles` SET `" + FuncName + "`='" + Anonym + "' WHERE CONVERT( `UserRoles`.`role` USING utf8 ) = 'anonym' LIMIT 1;");
//        mysqldb.getStatement().executeUpdate("INSERT INTO `xmppbot`.`sources` (`id`,`cmd`,`exec`,`ans`,`from`,`to`) VALUES (NULL,(SELECT id FROM funcs WHERE func = '_" + FuncName + "'),'" + execc + "','" + ansc + "','" + idc + "','" + idco + "'), (NULL,(SELECT id FROM funcs WHERE func = '_" + FuncName + "'),'" + execg + "','" + ansg + "','" + idg + "','" + idgo + "'), (NULL,(SELECT id FROM funcs WHERE func = '_" + FuncName + "'),'" + execp + "','" + ansp + "','" + idp + "','" + idpo + "'), (NULL,(SELECT id FROM funcs WHERE func = '_" + FuncName + "'),'" + execgp + "','" + ansgp + "','" + idgp + "','" + idgpo + "');");
//    }
}
